/**
 * Description:
 * Class Name:PushbackTest
 * Date:2022/5/2 14:39
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第15章_输入输出._15_4_输入输出流体系._15_4_4_推回输入流;

import java.io.FileReader;
import java.io.IOException;
import java.io.PushbackReader;

public class PushbackTest {
    public static void main(String[] args) {
        String class_path = "./src/" + PushbackTest.class.getName().replace(".", "/") + ".java";
        try (
                var pr = new PushbackReader(new FileReader(class_path),64)
                ){
            var buf = new char[32];
            // 用以保存上次读取的字符串内容
            var lastContent = "";
            var hasRead = 0;
            while ((hasRead = pr.read(buf)) > 0){
                // 将读取的内容转换成字符串
                var content = new String(buf, 0, hasRead);
                var targetIndex = 0;
                // 将上次读取的字符串和本次读取的字符串拼起来
                // 查看是否包含目标字符串，如果包含目标字符串，就将本次内容和上次内容一起推回缓冲区
                if ((targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0){
                    // 将本次内容和上次内容一起推回推回缓冲区
                    pr.unread((lastContent + content).toCharArray());
                    // 重新定义一个长度为targetIndex的char数组
                    if (targetIndex > 32){
                        buf = new char[targetIndex];
                    }
                    // 再次读取指定长度的内容（就是目标字符串之前的内容）
                    pr.read(buf, 0, targetIndex);
                    // 打印读取的内容后系统退出
                    System.out.println(new String(buf, 0, targetIndex));
                    System.exit(0);
                }
                else {
                    // 打印上次读取的内容
                    System.out.println(lastContent);
                    // 将本次内容设为上次读取的内容
                    lastContent = content;
                }
            }
        }
        catch (IOException ioException){
            ioException.printStackTrace();
        }
    }
}
